package com.xdwanj.tools;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class OriginalMethod {
    // 获取该文件夹里的所有文件及文件夹
    public List GetPath(File path) {
        // 把第一层文件夹里的所有文件及文件夹交给文件数组files
        File[] files = path.listFiles();
        List<File> files1 = new ArrayList<>();
        // 把文件数组files里的元素交给列表files1
        for (int i = 0; i < files.length; i++) {
            files1.add(files[i]);
        }
        // 列表files1里的元素遍历一遍
        for (int i = 0; i < files1.size(); i++) {
            File f = files1.get(i);
            // 如果是f文件夹
            if (f.isDirectory()) {
                // 把文件夹f传给方法GetPath2，并将返回得到的数组进行遍历
                for (File file : GetPath2(f)) {
                    // 把方法GetPath2里数组中的元素添加到列表files1中
                    files1.add(file);
                }
            }
        }
        // 创建一个新的列表
        List<File> files2 = new ArrayList<>();
        // 把根目录加到列表files2中
        files2.add(path);
        // 把列表files1中所有文件及文件夹加到列表files2中
        for (int i = 0; i < files1.size(); i++) {
            files2.add(files1.get(i));
        }
        return files2;
    }

    // 该方法与GetPath方法为一套功能，不能单独使用
    public File[] GetPath2(File file) {
        // 把文件夹file里的所有文件及文件夹交给数组files
        File[] files = file.listFiles();
        return files;
    }

    // 创建文件夹，该方法已被DevelopmentMethod类的CopyUp方法调用
    public File CreatNewDirectory(File file) {
        // 判断是否存在
        if (!file.exists()) {
            file.mkdirs();
        }
        return file;
    }

    // 创建文件
    public void CreatNewFile(File file) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 删除文件
    public void Delete(File del) {
        // 判断该文件是否存在
        if (!del.exists()) {
            return;
        }
        if (del.isFile()) {
            del.delete();
        }
    }

    // 复制粘贴，该方法为原方法，不能直接使用，该方法已被DevelopmentMethod类的CopyUp方法调用
    public File copy(File FileName, File target) {
        System.out.println(FileName.toString());
        System.out.println(target.toString());
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        // 创建粘贴板
        byte[] b = new byte[60000000];
        int len = 0;
        try {
            bis = new BufferedInputStream(new FileInputStream(FileName));
            bos = new BufferedOutputStream(new FileOutputStream(target));

            while ((len = bis.read(b)) != -1) {
                bos.write(b, 0, len);// 粘贴
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            bis.close();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return target;
    }

    // 获取子目录的文件夹名，该方法为原方法，不能直接使用，该方法已被DevelopmentMethod类的CopyUp方法调用
    public File GetChildPath(File file, File file1) {
        // 将绝对路径名file1转成StringBuffer ChildPath
        StringBuffer ChildPath = new StringBuffer();
        ChildPath.append(file1);
        // 把绝对路径删剩子目录
        ChildPath.delete(0, ChildPath.lastIndexOf("\\"));
        // 获取子目录文件夹字符串长度
        int i = ChildPath.length();
        // 获取绝对路径名file1的字符串长度
        int n = (String.valueOf(file1)).length();
        // 将文件/文件夹绝对路径名file转成StringBuffer Path1
        StringBuffer Path1 = new StringBuffer();
        Path1.append(file.getPath());
        // 将文件/文件夹绝对路径名file删剩子目录
        Path1.delete(0, n - i + 1);
        File file2 = new File(String.valueOf(Path1));
        // 返回子目录（ps：确实不像子目录（ps：想知道的话去122行看看你就知道是什么））
        return file2;
    }

    // 创建新文件名，该方法为原方法，不能直接使用，该方法已被DevelopmentMethod类的CopyUp方法调用
    // 注意：传进来的源文件夹Filename有可能是已经被方法GetChildPath处理过的无盘符无法路径文件夹/文件（ps：不完全是个子目录（ps：我更觉得是个四不像玩意（ps：不要问我为什么（ps：因为懒得答）））
    public File CreatNewFileName(File Filename, File target) {
        // 把源文件夹/文件Filename和目标文件夹/盘符target转成StringBuffer，分别为filename1，filename2
        StringBuffer filename1 = new StringBuffer();
        StringBuffer filename2 = new StringBuffer();
        filename1.append(Filename.getPath());
        filename2.append(target.getPath());
        // 获取源文件/文件Filename的盘符
        String str1 = new String(filename1.substring(0, 3));
        String str2 = new String(filename2);
        // 判断目标文件夹/盘符target是否只有盘符以及对比源文件夹/文件Filename和目标文件夹target的盘符是否相同，如果是，给目标文件夹名字后面加个1
        if (filename2.length() == 3 && str1.equals(str2)) {
            filename1.insert(filename1.indexOf("\\", 4), "1");
        }
        // 判断源文件/文件Filename是否有盘符，有就删掉
        if (new String(filename1).contains(":")) {
            filename1.delete(0, 3);
        }
        // 判断粘贴处是否为文件，且不为盘符
        if (!target.exists() || target.isDirectory() && filename2.length() != 3) {
            filename2.append("\\");
            filename1.insert(0, filename2);
            File file = new File(String.valueOf(filename1));
            return file;
        }
        // 将源文件夹/文件Filename接在目标文件夹/盘符target后面
        filename1.insert(0, target);
        // 将接好的路径返回
        File file = new File(String.valueOf(filename1));
        return file;
    }

    public File getFileName(File val) {
        StringBuffer sb = new StringBuffer(val.toString());
        File fi = null;

        while (true) {
            if (sb.indexOf("\\") != -1) {
                sb.delete(0, sb.indexOf("\\") + 1);
            } else {
                String str = new String(sb);
                fi = new File(str);
                return fi;
            }
        }
    }
}
